/*
 * $Header: Assert.java asc-commons-lang
 * $Revision: 
 * $Date: 27.12.2007 20:51:07
 *
 * ==========================================================
 * COPYRIGHTS
 * ==========================================================
 */

package org.pentaho.di.core.util;

import java.text.MessageFormat;
import java.util.Collection;
import java.util.Map;

import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;

/**
 * @author <a href="mailto:thomas.hoedl@aschauer-edv.at">Thomas Hoedl(asc042)</a>
 * @version $Revision
 * 
 */
public final class Assert { //NOPMD

    private static final int INPUT_MAX_WIDTH = 30;

    /**
     * Avoid direct creation.
     */
    private Assert() {
        super();
    }

    /**
     * @param input
     *            input to test.
     * @param predicate
     *            predicate to apply.
     * @throws IllegalArgumentException
     *             if predicate rejected input.
     */
    public static void assertTrue(final Object input, final Predicate predicate) throws IllegalArgumentException {
        if (predicate.evaluate(input)) {
            return;
        }
        final StringBuilder builder = new StringBuilder();
        builder.append("Predicate rejected input [predicate=");
        builder.append(predicate);
        builder.append(", input=");
        builder.append(StringUtils.abbreviate(String.valueOf(input), INPUT_MAX_WIDTH));
        builder.append("]");
        throw new IllegalArgumentException(builder.toString());
    }

    /**
     * @param bool
     *            boolean to test.
     * @throws IllegalArgumentException
     *             if bool is false.
     */
    public static void assertTrue(final boolean bool) throws IllegalArgumentException {
        assertTrue(bool, "Value cannot be false");
    }

    /**
     * @param message
     *            message.
     * @param bool
     *            boolean to test.
     * @param args
     *            arguments to set, optional
     * @throws IllegalArgumentException
     *             if bool is false.
     */
    public static void assertTrue(final boolean bool, final String message, final Object... args)
            throws IllegalArgumentException {
        if (bool) {
            return;
        }
        if (args != null && args.length > 0) {
            throw new IllegalArgumentException(MessageFormat.format(message, args));
        }
        throw new IllegalArgumentException(message);
    }

    /**
     * @param bool
     *            boolean to test.
     * @throws IllegalArgumentException
     *             if bool is true.
     */
    public static void assertFalse(final boolean bool) throws IllegalArgumentException {
        assertFalse(bool, "Value cannot be true");
    }

    /**
     * @param bool
     *            boolean to test.
     * @param message
     *            message.
     * @param args
     *            optinal arguments.
     * @throws IllegalArgumentException
     *             if bool is true.
     */
    public static void assertFalse(final boolean bool, final String message, final Object... args)
            throws IllegalArgumentException {
        if (!bool) {
            return;
        }
        if (args != null && args.length > 0) {
            throw new IllegalArgumentException(MessageFormat.format(message, args));
        }
        throw new IllegalArgumentException(message);
    }

    /**
     * @param input
     *            input to test.
     * @param predicate
     *            predicate to apply.
     * @throws IllegalArgumentException
     *             if predicate didn't rejected input.
     */
    public static void assertFalse(final Object input, final Predicate predicate) throws IllegalArgumentException {
        if (!predicate.evaluate(input)) {
            return;
        }
        final StringBuilder builder = new StringBuilder();
        builder.append("Predicate didn't rejected input [predicate=");
        builder.append(predicate);
        builder.append(", input=");
        builder.append(StringUtils.abbreviate(String.valueOf(input), INPUT_MAX_WIDTH));
        builder.append("]");
        throw new IllegalArgumentException(builder.toString());
    }

    /**
     * @param collection
     *            collection to test.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    @SuppressWarnings("unchecked") //NOPMD
    public static void assertNotNullOrEmpty(final Collection collection) throws IllegalArgumentException {
        if (collection == null || collection.isEmpty()) {
            throw new IllegalArgumentException("Collection cannot be null or empty");
        }
    }

    /**
     * @param collection
     *            collection to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    @SuppressWarnings("unchecked")
    public static void assertNotNullOrEmpty(final Collection collection, final String message)
            throws IllegalArgumentException {
        if (collection == null || collection.isEmpty()) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param array
     *            collection to test.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    public static void assertNotNullOrEmpty(final Object[] array) throws IllegalArgumentException {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException("Array cannot be null or empty");
        }
    }

    /**
     * @param array
     *            array to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    public static void assertNotNullOrEmpty(final Object[] array, final String message)
            throws IllegalArgumentException {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param map
     *            collection to test.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    @SuppressWarnings("unchecked")
    public static void assertNotNullOrEmpty(final Map map) throws IllegalArgumentException {
        if (map == null || map.isEmpty()) {
            throw new IllegalArgumentException("Map cannot be null or empty");
        }
    }

    /**
     * @param map
     *            map to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if collection is null or empty.
     */
    @SuppressWarnings("unchecked")
    public static void assertNotNullOrEmpty(final Map map, final String message) throws IllegalArgumentException {
        if (map == null || map.isEmpty()) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param input
     *            input to test.
     * @throws IllegalArgumentException
     *             if input is null or empty.
     */
    public static void assertNotEmpty(final String input) throws IllegalArgumentException {
        if (StringUtils.isEmpty(input)) {
            throw new IllegalArgumentException("Input cannot be null or empty");
        }
    }

    /**
     * @param input
     *            input to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if input is null or empty.
     */
    public static void assertNotEmpty(final String input, final String message) throws IllegalArgumentException {
        if (StringUtils.isEmpty(input)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param input
     *            input to test.
     * @throws IllegalArgumentException
     *             if input is null or empty.
     */
    public static void assertNotBlank(final String input) throws IllegalArgumentException {
        if (StringUtils.isBlank(input)) {
            throw new IllegalArgumentException("Input cannot be null or empty");
        }
    }

    /**
     * @param input
     *            input to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if input is null or empty.
     */
    public static void assertNotBlank(final String input, final String message) throws IllegalArgumentException {
        if (StringUtils.isBlank(input)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param input
     *            input to test.
     * @throws IllegalArgumentException
     *             if input is null.
     */
    public static void assertNotNull(final Object input) throws IllegalArgumentException {
        if (input == null) {
            throw new IllegalArgumentException("Input cannot be null");
        }
    }

    /**
     * @param input
     *            input to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if input is null.
     */
    public static void assertNotNull(final Object input, final String message) throws IllegalArgumentException {
        if (input == null) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param input
     *            input to test.
     * @throws IllegalArgumentException
     *             if input isn't null.
     */
    public static void assertNull(final Object input) throws IllegalArgumentException {
        if (input != null) {
            throw new IllegalArgumentException("Input must be null");
        }
    }

    /**
     * @param input
     *            input to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if input isn't null.
     */
    public static void assertNull(final Object input, final String message) throws IllegalArgumentException {
        if (input != null) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param value
     *            value to test.
     * @throws IllegalArgumentException
     *             if value is null or <= 0.
     */
    public static void assertGreaterZero(final Integer value) throws IllegalArgumentException {
        assertGreaterZero(value, "Value must be greater than 0");
    }

    /**
     * @param value
     *            value to test.
     * @throws IllegalArgumentException
     *             if value is null or <= 0.
     */
    public static void assertGreaterZero(final Double value) throws IllegalArgumentException {
        assertGreaterZero(value, "Value must be greater than 0");
    }

    /**
     * @param value
     *            value to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if value is null or <= 0.
     */
    public static void assertGreaterZero(final Double value, final String message) throws IllegalArgumentException {
        if (value == null || value <= 0) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * @param value
     *            value to test.
     * @param message
     *            the message.
     * @throws IllegalArgumentException
     *             if value is null or <= 0.
     */
    public static void assertGreaterZero(final Integer value, final String message) throws IllegalArgumentException {
        if (value == null || value <= 0) {
            throw new IllegalArgumentException(message);
        }
    }
}
